//
//  MolonRequestHelper.h
//
//  Created by Molon on 13-10-4.
//  Copyright (c) 2013年 Molon. All rights reserved.

#import <Foundation/Foundation.h>

//通常情况下方便编写代码的define
#define MLISRH(helperClass) ([requestHelper isMemberOfClass:[helperClass class]])

#define MLRH(apihelperClass) \
apihelperClass *helper = (apihelperClass *)requestHelper; \
\

typedef NS_ENUM(NSUInteger, MolonRequestHelperState) {
    MolonRequestHelperStateUnRequest = 0, //未请求
    MolonRequestHelperStateRequesting, //请求中
    MolonRequestHelperStateRequestSuccess, //请求成功
    MolonRequestHelperStateRequestFailed,//请求失败
    MolonRequestHelperStateRequestError,//请求错误
};

typedef NS_ENUM(NSUInteger, MolonRequestHelperCacheType) {
    MolonRequestHelperCacheTypeNoCache = 0, //不缓存任何东西
    MolonRequestHelperCacheTypeReturnValidCacheElseRequest, //有效缓存存在返回它，否则去请求
    MolonRequestHelperCacheTypeFirstReturnInvalidCacheAndRequest, //有效缓存存在返回它，否则先返回过期缓存并且请求
    MolonRequestHelperCacheTypeFirstReturnCacheAndAlwaysRequest, //这个type下忽略了cacheValidTime，一直先返回缓存并且请求(这个一般是为了更好的体验和及时性时用，缓存在此只是为了更好的体验而不是为了减少网络吞吐量了)
};

@interface MolonRequestHelper : NSObject<NSCopying>
#warning tips for future 重写时候需要添加一个保留属性，以便于使用
/**
 *  当前请求状态
 */
@property (nonatomic, assign) MolonRequestHelperState state;

/**
 *  请求地址
 */
@property (nonatomic, copy, readonly) NSString *methodName;

/**
 *  请求返回的原始数据，一般不需要处理
 */
@property (nonatomic, strong) id responseData;

/**
 *  请求返回发生了错误的记录集合，其中两个元素 code 和 message
 */
@property (nonatomic, strong) NSDictionary *error;

/**
 *  缓存文件路径
 */
@property (nonatomic, copy) NSString *cacheFilePath;

/**
 *  当前是否处于预加载状态下
 */
@property (nonatomic, assign) BOOL isCurrentPreloaded;

/**
 *  默认为MolonRequestHelperCacheTypeNoCache
 */
@property (nonatomic, assign) MolonRequestHelperCacheType cacheType;


/**
 *  添加其他参数
 */
@property (nonatomic, copy) NSDictionary*(^otherParamsBeforeRequestBlock)(MolonRequestHelper *helper);

/**
 *  可以在请求成功之后对result进行整理
 */
@property (nonatomic, copy) id (^tidyResultWithSuccessResultBlock)(id result,MolonRequestHelper *helper);

/**
 *  请求成功之后的自定义处理result数据转换为model对象
 */
@property (nonatomic, copy) void(^customHandResponseDataWithSuccessResultBlock)(id result,MolonRequestHelper *helper);

/**
 *  状态改变的回调
 */
@property (nonatomic, copy) void(^stateChangedBlock)(MolonRequestHelperState state,MolonRequestHelper *helper);

/**
 *  自定义超时时间
 */
- (NSTimeInterval)customTimeoutInterval;

//下面4个通常只供MolonAPI使用
- (NSMutableDictionary *)getRequestParams;
- (NSMutableDictionary *)getRequestFiles;
- (void)handleResponseDataWithDictionary:(NSMutableDictionary *)responseInfo;
- (void)handleResponseDataWithArray:(NSMutableArray *)responseInfo;

/**
 *  可方便判断是否当前请求是处于请求结束时候
 */
- (BOOL)isRequestCompleted;

/**
 *  供继承，设置请求的地址名字
 */
- (NSString*)configureMethodName;

/**
 *  可选继承，在发送请求之前可做一些操作
 */
- (void)doSomethingBeforeSend __attribute__((objc_requires_super));
/**
 *  可选继承，在发送请求成功之后可做一些操作
 */
- (void)doSomethingAfterRequestSuccess __attribute__((objc_requires_super));
- (void)doSomethingAfterCachePreloaded __attribute__((objc_requires_super));

/**
 *  cache有效时间，以秒为单位
 */
- (NSTimeInterval)cacheValidTime;

@end
